8. 日志(logging)

8.1. 日志相关概念

  • 日志

  • 严重性级别(Level)

    • 不同用户

      • 用户

      • 开发

      • 运维

    • DEBUG

    • INFO

    • NOTICE

    • WARNING

    • ERROR

    • CRITICAL

    • ALERT

    • EMERGENCY

  • IO操作

  • 作用:

    • 调试

    • 了解软件运行情况

    • 时候分析定位问题

  • 日志信息:

    • time

    • lcoation

    • level

    • content

  • 成熟第三方

    • log4j

    • log4php

    • python: logging

8.2. Logging模块

  • 级别

    • 可以自定义

    • DEBUG

    • INFO

    • WARNING

    • ERROR

    • CRITICAL

  • 级别逐渐增加

  • 只需要指定一个级别就好,高级别的自动记录

  • 使用方式:

    • 直接使用logging(封装了其他组件)

    • 使用Logging四大组件

8.3. 2.1 logging模块级别日志

  • 使用一下几个函数

      logging.debug(msg, *args, **kwargs) 	创建一条严重级别为DEBUG的日志记录
      logging.info(msg, *args, **kwargs) 	创建一条严重级别为INFO的日志记录
      logging.warning(msg, *args, **kwargs) 	创建一条严重级别为WARNING的日志记录
      logging.error(msg, *args, **kwargs) 	创建一条严重级别为ERROR的日志记录
      logging.critical(msg, *args, **kwargs) 	创建一条严重级别为CRITICAL的日志记录
      logging.log(level, *args, **kwargs) 	创建一条严重级别为level的日志记录
      logging.basicConfig(**kwargs) 	对root logger进行一次性配置
    
  • logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数

    • 只第一次调用起作用

    • 不配置使用默认值

      • 输出: sys.stderr

      • 级别: WARNING

      • 格式: lever:log name:content

  • 案例01

  • format参数

      asctime 	%(asctime)s 	日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
      created 	%(created)f 	日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
      relativeCreated 	%(relativeCreated)d 	日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
      msecs 	%(msecs)d 	日志事件发生事件的毫秒部分
      levelname 	%(levelname)s 	该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
      levelno 	%(levelno)s 	该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
      name 	%(name)s 	所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
      message 	%(message)s 	日志记录的文本内容,通过 msg % args计算得到的
      pathname 	%(pathname)s 	调用日志记录函数的源码文件的全路径
      filename 	%(filename)s 	pathname的文件名部分,包含文件后缀
      module 	%(module)s 	filename的名称部分,不包含后缀
      lineno 	%(lineno)d 	调用日志记录函数的源代码所在的行号
      funcName 	%(funcName)s 	调用日志记录函数的函数名
      process 	%(process)d 	进程ID
      processName 	%(processName)s 	进程名称,Python 3.1新增
      thread 	%(thread)d 	线程ID
      threadName 	%(thread)s 	线程名称 
    
  • 日志器有层级关系,默认是RootLogger,单例模式

  • 对于msg可以使用format格式, logging.debug(“%s is %d years old”, ‘dana’, 10)

  • **kwargs参数的含义

    • exc_info: 其值为布尔值,如果该参数的值设置为True,则会将异常异常信息添加到日志消息中。如果没有异常信息则添加None到日志信息中。

    • stack_info: 其值也为布尔值,默认值为False。如果该参数的值设置为True,栈信息将会被添加到日志信息中。

    • extra: 这是一个字典(dict)参数,它可以用来自定义消息格式中所包含的字段,但是它的key不能与logging模块定义的字段冲突。

  • 案例02

8.4. 2.1 logging模块日志处理流程

  • 四大组件, logging模块由四个模块来处理日志

    • 日志器 Logger 提供了应用程序可一直使用的接口

    • 处理器 Handler 将logger创建的日志记录发送到合适的目的输出

    • 过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录

    • 格式器 Formatter 决定日志记录的最终输出格式

    日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等; 不同的处理器(handler)可以将日志输出到不同的位置; 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置; 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志; 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

  • Logger

    • 三大任务

      • 1)向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息;

      • 2)基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理;

      • 3)将日志消息传送给所有感兴趣的日志handlers。

    • 对象分类

      • 配置

          Logger.setLevel() 	设置日志器将会处理的日志消息的最低严重级别
          Logger.addHandler()  Logger.removeHandler() 	为该logger对象添加  移除一个handler对象
          Logger.addFilter()  Logger.removeFilter() 	为该logger对象添加  移除一个filter对象
        
      • 日志创建

        • Logger.debut()…….

        • Logger.exception(): 创建类似于Logger.error的日志消息

        • Logger.log():获取一个明确的日志level参数类创建一个日志记录

    • 得到Logger对象

      • 实例化

      • logging.getLogger(): name=’root’

  • Handler

    • 把消息发送到handler指定的位置

    • Logger通过addHandler添加handler

    • 方法:

      • setLevel

      • setFormat

      • addFilter, removeFilter

    • 不要直接使用,Handler是基础类

        logging.StreamHandler 	将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。
        logging.FileHandler 	将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
        logging.handlers.RotatingFileHandler 	将日志消息发送到磁盘文件,并支持日志文件按大小切割
        logging.hanlders.TimedRotatingFileHandler 	将日志消息发送到磁盘文件,并支持日志文件按时间切割
        logging.handlers.HTTPHandler 	将日志消息以GET或POST的方式发送给一个HTTP服务器
        logging.handlers.SMTPHandler 	将日志消息发送给一个指定的email地址
        logging.NullHandler 	该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
      
  • Format类

    • 应用代码可以直接实例化

    • 可以继承Format添加特殊内容

    • 三个参数:

      • fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值

      • datefmt:指定日期格式字符串,如果不指定该参数则默认使用”%Y-%m-%d %H:%M:%S”

      • style:Python 3.2新增的参数,可取值为 ‘%’, ‘{‘和 ‘$’,如果不指定该参数则默认使用’%’

  • Filter类

    • 被Handdler和Logger使用

    • 用于具体控制传递的record记录是否能通过过滤

  • 案例03